package colibri.lcdui;

import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;

/**Constroi um gauge.
 * @author Bayron Thiengo Quinelato
 */
public class Gauge extends Item implements Runnable {

    //Tipos de Gauge.
    public static final int PING_PONG = 0;
    public static final int PROGRESS = 1;
    public int gaugeType;
    //Valores máximo e mínimo do gauge.
    private int min, max;
    //Valor atual do menidor. Posição x da barra que se movimenta.
    private int value;
    // Indica se o gauge está ativado ou desativado
    private boolean start;
    //Controla quando o gauge deve se mover para direita ou para esquerda.
    private boolean falgLR;
    //Imagem do gauge, da barra do gauge.
    private Image imgBar;
    private int barW, barH;
    private int colorBar;
    private int colorLabel;
    private Font font;
    private int fontH;

    /**Inicializa o objeto.
     * @param x Posição x (horizontal) do componente.
     * @param y Posição y (Vertical) do componente.
     * @param widht Largura do componente.
     * @param widht Altura do componente.
     * @param period Tempo em milisegundos entre as sucessivas execuções da tarefa.
     * @param anchor Ponto âncora do componente.
     */
    public Gauge(String label, int x, int y, int width, int height) {
        super(x, y, width, 0, 20);
        super.label = label;
        focusable = false;
        imgBar = null;
        barH = height;
        barW = 45;
        value = 0;
        falgLR = false;
        start = false;
        colorBar = 0x000000;
        colorLabel = 0x000000;
        font = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_MEDIUM);
        fontH = font.getHeight() + 2;
        refreshHeight();
    }

    public void setImage(Image img) {
        if (img == null)
            return;
        try {
            imgBar = img;
            barH = imgBar.getHeight();
            barW = imgBar.getWidth();
            refreshHeight();
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new NullPointerException("Colibri error: Falha no método setImage. Não foi possível carregar a imagem do Gauge.");
        }
    }

    private void refreshHeight() {
        if (label != null)
            setHeight(barH + 2 + fontH);
        else
            setHeight(barH + 2);
    }

    /**Setter do valor atual do medidor.
     * @param value Valor atual do medidor.
     */
    public void setValue(int value) {
        if (falgLR)
            this.value -= value;
        else
            this.value += value;
    }

    /**Setter dos valores mínimo e máximo do gauge.
     * @param value Valor atual do medidor.
     */
    public void setMinMax(int min, int max) {
        this.min = min;
        this.max = max;
    }

    public void start() {
        value = 0;
        falgLR = false;
        start = true;
        new Thread(this).start();
    }

    public void stop() {
        start = false;
    }

    /**Informa se o gauge parou.
     * @return true se parou ou false se não parou.
     */
    public boolean hasStart() {
        return start;
    }

    public void setLabel(String label) {
        super.label = label;
        refreshHeight();
    }

    public void setLabelFont(Font font) {
        this.font = font;
        fontH = font.getHeight() + 2;
        refreshHeight();
    }

    public void setLabelColor(int color) {
        colorLabel = color;
    }

    public void setBarColor(int color) {
        colorBar = color;
    }

    public void callPaint(Graphics g) {
        int tmpY = y;
        if (label != null) {
            g.setFont(font);
            g.setColor(colorLabel);
            g.drawString(label, x + getWidth() / 2, tmpY, Graphics.TOP | Graphics.HCENTER);
            tmpY += fontH;
        }
        g.setColor(0xFFFFFF);
        g.fillRect(x, tmpY, getWidth(), barH + 2);
        g.setColor(0x000000);
        g.drawRect(x, tmpY, getWidth() - 1, barH + 1);
        if (value + barW >= getWidth()) {
            value = getWidth() - barW - 1;
            falgLR = true;
        } else if (value <= 0) {
            value = 1;
            falgLR = false;
        }
        if (imgBar == null) {
            g.setColor(colorBar);
            g.fillRect(x + value, tmpY + 1, barW, barH);
        } else
            g.drawImage(imgBar, x + value, tmpY + 1, anchor);
    }

    public void run() {
        try {
            while (start) {
                if (visible && getCanvas() != null && getCanvas().isShown()) {
                    setValue(4);
                    repaint();
                }
                synchronized (this) {
                    wait(50L);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new IndexOutOfBoundsException("Colibri error: Falha durante execução do Item Gauge.");
        }
    }
}
